class Observer {
    constructor(data){
        this.walk(data)
    }
    // 遍历data属性，如果是空或非对象，则不处理，如果是对象则遍历所有属性，
    walk(data) {
        if(!data || typeof data != 'object'){
            return 
        }
        Object.keys(data).forEach(key => {
            this.defineReactive(data,key,data[key])
        })
    }
    defineReactive(obj,key,val){
        let that = this
        let dep = new Dep()
        this.walk(val) // 如果data中某个属性是对象
        Object.defineProperty(obj,key,{
            configurable:true,
            enumerable:true,
            get(){
                Dep.target && dep.addSub(Dep.target)
                return val
            },
            set(newValue) {
                if(newValue ==val) {
                    return 
                }
                val = newValue
                that.walk(newValue) // 如果某个属性的值要改变为对象，则让该属性为响应式
                // 发送通知
                dep.notify()
            }
        }) 
    }
}